#ifndef FOC_MATH_H
#define FOC_MATH_H

#include "arm_math.h"

// 扇区枚举
typedef enum
{
    SECTOR_1 = 1,
    SECTOR_2,
    SECTOR_3,
    SECTOR_4,
    SECTOR_5,
    SECTOR_6
} svpwm_sector_t;

typedef struct
{
    float sin_val;  // 电角度的正弦值，用于FOC计算
    float cos_val;  // 电角度的余弦值，用于FOC计算
} Circular_t;

typedef struct
{
    float i_a;  // A 相电流
    float i_b;  // B 相电流
    float i_c;  // C 相电流
} I_adc_t;

typedef struct
{
    float v_a;  // A 相电压
    float v_b;  // B 相电压
    float v_c;  // C 相电压
} V_adc_t;

typedef struct
{
    float i_alpha;  // Alpha 坐标系电流（Clarke变换后的电流）
    float i_beta;   // Beta  坐标系电流（Clarke变换后的电流）
} I_alphabeta_t;

typedef struct
{
    float v_alpha;  // Alpha 坐标系电压（逆Clarke变换后的电压）
    float v_beta;   // Beta  坐标系电压（逆Clarke变换后的电压）
} V_alphabeta_t;

typedef struct
{
    float i_d;  // D 坐标系电流（FOC中的直轴电流）
    float i_q;  // Q 坐标系电流（FOC中的交轴电流）
} I_dq_t;

typedef struct
{
    float v_d;  // D 坐标系电压（FOC中的直轴电压） 控制扭矩
    float v_q;  // Q 坐标系电压（FOC中的交轴电压） 弱磁控制
} V_dq_t;

// 函数声明部分
Circular_t DSP_Sin_Cos(float ElAngle);  // 计算正弦和余弦值
Circular_t CORDIC_sin_cos(float ElAngle);
I_alphabeta_t Clarke(I_adc_t* I_adc);                        // Clarke变换
I_dq_t Park(I_alphabeta_t* foc, Circular_t* Circular);       // Park变换
V_adc_t Inv_clarke(V_alphabeta_t* V_alphabeta);              // 逆Clarke变换
V_alphabeta_t Inv_Park(V_dq_t* V_dq, Circular_t* Circular);  // 逆Park变换
V_adc_t Svpwm_Midpoint(V_alphabeta_t* V_alphabeta);          // SVPWM调制
V_adc_t Svpwm_Sector(V_alphabeta_t* V_alphabeta);            // SVPWM扇区选择

#endif  // FOC_MATH_H
